<!DOCTYPE html>
<head>
    <meta charset="utf-8" />
    <meta name="author" content="leo108">
    <title>详细文档</title>
    <meta name="description" content="SinglePHP" />
    <link href="http://cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
    <link href="http://v3.bootcss.com/assets/css/docs.min.css" rel="stylesheet">
    <link href="http://cdn.bootcss.com/highlight.js/7.3/styles/github.min.css" rel="stylesheet">
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    </head>
<body >
    <header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
  <div class="container">
    <div class="navbar-header">
      <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a href="./" class="navbar-brand">SinglePHP</a>
    </div>
    <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
      <ul class="nav navbar-nav">
        <li>
          <a href="./start.html">简介</a>
        </li>
        <li class="active">
          <a href="./doc.html">详细文档</a>
        </li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li>
          <a target='_blank' href="https://github.com/leo108/SinglePHP">SinglePHP官网</a>
        </li>
      </ul>
    </nav>
  </div>
</header>
    <div class="bs-docs-header" id="content">
      <div class="container">
        <h1>详细文档</h1>
        <p>完整介绍SinglePHP的使用。</p>
      </div>
    </div>
    <div class="container bs-docs-container">
      <div class="row">
        <div class="col-md-3">
            <div class="bs-docs-sidebar hidden-print hidden-xs hidden-sm" role="complementary">
            <ul class="nav bs-docs-sidenav">
                <li>
                  <a href="#conf">配置</a>
                </li>
                <li>
                  <a href="#router">路由</a>
                </li>
                <li>
                  <a href="#controller">控制器</a>
                </li>
                <li>
                  <a href="#db">数据库操作</a>
                </li>
                <li>
                  <a href="#view">视图引擎</a>
                </li>
                <li>
                  <a href="#autoload">自动加载</a>
                </li>
                <li>
                  <a href="#log">日志</a>
                </li>
            </ul>
            <a class="back-to-top" href="#top">
              返回顶部
            </a> 
          </div>
        </div>
        <div class="col-md-9" role="main">
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="conf">配置</h1>
              </div>
              <p class="lead">项目配置需要在入口文件传递给SinglePHP，目前支持的配置如下：</p>
              <div class='highlight'>
              <pre><code class='language-php'>$config = array(
    'APP_PATH'    =&gt; './App/',       #APP业务代码文件夹
    'DB_HOST'     =&gt; '127.0.0.1',    #数据库主机地址
    'DB_PORT'     =&gt; '3306',         #数据库端口，默认为3306
    'DB_USER'     =&gt; 'root',         #数据库用户名
    'DB_PWD'      =&gt; 'toor',         #数据库密码
    'DB_NAME'     =&gt; 'singlephp',    #数据库名
    'DB_CHARSET'  =&gt; 'utf8',         #数据库编码，默认utf8
    'PATH_MOD'    =&gt; 'NORMAL',       #路由方式，支持NORMAL和PATHINFO，默认NORMAL
    'USE_SESSION' =&gt; true,           #是否开启session，默认false
);
SinglePHP::getInstance($config)-&gt;run();
              </code></pre>
              </div>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="router">路由</h1>
              </div>
              <p class="lead">目前路由支持NORMAL和PATHINFO两种方式</p>
              <h3>NORMAL方式</h3>
              <p class="lead">在NORMAL方式下，必须通过url的c和a参数来指定对应的controller和action，默认都是Index。url的路由关系示例：</p>
                <div class="highlight">
                <pre><code>index.php                //IndexController-&gt;IndexAction
index.php?a=Test         //IndexController-&gt;TestAction
index.php?c=Test         //TestController-&gt;IndexAction
index.php?c=Test&amp;a=Test  //TestController-&gt;TestAction
</code></pre>
                </div>
              <h3>PATHINFO方式</h3>
              <p class="lead">PATHINFO方式需要webserver支持PATHINFO，可以通过<code>var_dump($_SERVER['PATH_INFO']);</code>来查看。如果webserver不支持PATHINFO，而又配置成了PATHINFO方式的路由，SinglePHP将会忽略此项配置而采用NORMAL方式路由。示例如下：</p>
                <div class="highlight">
                <pre><code>index.php            //IndexController-&gt;IndexAction
index.php/Test       //TestController-&gt;IndexAction
index.php/Test/Test  //TestController-&gt;TestAction
</code></pre>
                </div>
              <p class='lead'>同时可以配合webserver的rewrite功能将index.php去掉，美化url。</p>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="controller">控制器</h1>
              </div>
              <p class="lead">所有的控制器必须继承Controller类或其子类，并且类名必须以Controller结尾，统一放置在Controller目录下，文件名必须是“类名.class.php”。</p>
              <p class="lead">每一个Action对应控制器类的一个方法，方法名必须以Action结尾，同时必须是public权限。</p>
              <p class="lead">示例代码如下：</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
class IndexController extends Controller {  //控制器必须继承Controller类或其子类
    public function IndexAction(){          //public权限，方法名以Action结尾
    }
    public function other(){                //方法名不是以Action结尾，不可以被直接路由到
    }
}</code></pre>
              </div>
              <p class="lead">同时控制器提供了几个方法用来简化操作：</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
class IndexController extends Controller { 
    public function RedirectAction(){ 
        $this-&gt;redirect('http://www.baidu.com'); //302跳转到百度
    }
    public function AjaxAction(){
        $ret = array(
            'result' =&gt; true,
            'data'   =&gt; 123,
        );
        $this-&gt;AjaxReturn($ret);                //将$ret格式化为json字符串后输出到浏览器
    }
}</code></pre>
              </div>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="db">数据库操作</h1>
              </div>
              <p class="lead">SinglePHP不能称为一个MVC框架的原因就是SinglePHP没有M。为了精简代码，SinglePHP只提供了简单的<code>query</code>和<code>execute</code>，并没有做模型和数据表的映射。</p>
              <p class='lead'>可以通过M函数来便捷的获取数据库对象（没错就是抄的thinkphp你咬我啊）。代码如下：</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
$db = M();  //获取数据库对象，前提是在入口文件配好数据库相关的配置
$name = $db-&gt;escape($_GET['name']);  //转义字符
//查询，失败返回false，否则返回数据
$ret = $db-&gt;query("select * from user where name = '$name'");
echo $db-&gt;getRows();  //获得返回的行数
echo $db-&gt;getLastSql();  //获得上一次执行的sql
//执行增删改语句，失败返回false，否则返回影响的行数
$count = $db-&gt;execute("insert user (name, email) values ('leo108', 'leo108@qq.com')");
echo $db-&gt;getRows();  //获得返回的行数
echo $db-&gt;getInsertId();  //获得自增ID
echo $db-&gt;getError();  //如果执行sql失败，可以获得失败原因</code></pre>
              </div>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="view">视图引擎</h1>
              </div>
              <p class="lead">SinglePHP没有提供语法花哨的模板引擎，而是采用原生的PHP语法。一来降低学习成本，二来减少SinglePHP的体积。</p>
              <p class='lead'>通过Controller类的<code>assign</code>来给模板变量赋值，通过<code>display</code>方法来渲染模板。</p>
              <p class='lead'>assign方法接受两个参数，第一个参数是模板变量名，第二个参数是模板变量值。</p>
              <p class='lead'>display方法可以接受1个或0个参数。当没有参数时，则默认使用View/控制器名/Action名.php作为模板；如果参数值不带有'/'，则默认使用View/控制器名/参数值.php作为模板；如果参数值带有1个'/'，则会使用View/参数值.php作为模板。</p>
              <p class='lead'>示例代码如下：</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
class IndexController extends Controller { 
    public function IndexAction(){
        $this-&gt;assign('str', 'hello world'); //给模板变量str赋值'hello world'
        $this-&gt;display();           //使用View/Index/Index.php作为模板
    }
    public function TestAction(){
        $this-&gt;display('test2');    //使用View/Index/test2.php作为模板
    }
    public function AnotherTestAction(){
        $this-&gt;display('user/test');    //使用View/user/test.php作为模板
    }
}</code></pre>
              </div>
              <p class='lead'>SinglePHP还提供了模板include功能，通过<code>View::tplInclude</code>来引入其他模板，该静态方法接受1个或2个参数，第一个参数是模板，规则与<code>display</code>的参数相同，第二个参数是传递给该模板的模板变量，必须是关联型数组。</p>
              <p class='lead'>示例代码如下：</p>
              <p>View/Public/header.php 公共头部文件</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;!DOCTYPE html&gt;
&lt;head&gt;
    &lt;title&gt;&lt;?php echo $title;?&gt;&lt;/title&gt;
&lt;/head&gt;</code></pre>
              </div>
              <p>View/Index/Index.php 首页模板文件</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
$data = array(
        'title' =&gt; 'Welcome',  //设置title变量为Welcome
        );
?><include "Public/header"/>
xxxxxxx其他玩意</code></pre>
              </div>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="autoload">自动加载</h1>
              </div>
              <p class="lead">除了自动加载Controller类之外，SinglePHP还会自动加载一个App/common.php和App/Lib下的类文件</p>
              <p class='lead'>App/common.php这个文件里可以是通用的函数，如果不存在也不会影响程序的运行。</p>
              <p class='lead'>当SinglePHP遇到一个未定义的类时，会尝试去加载App/Lib/类名.class.php，例如有一个分页类Page，那么会尝试加载App/Lib/Page.class.php，如果文件不存在，或者文件中也没有定义这个类，将会报错～</p>
            </div>
            <div class="bs-docs-section">
              <div class="page-header">
                <h1 id="log">日志</h1>
              </div>
              <p class="lead">SinglePHP提供了一个简单的日志类，可以分级记录各类信息，目前提供了Fatal、Warning、Notice、Debug和Sql5种级别。日志会存储在App/Log目录下，当然前提条件是该目录是可写的。日志是按天存储的，如果是Fatal和Warning的日志，则会存放在.log.wf文件里。SinglePHP本身会打一些必要的日志，例如sql执行记录，路由出错等等。</p>
              <p class='lead'>代码如下：</p>
              <div class='highlight'>
              <pre><code class="language-php">&lt;?php
Log::fatal('something');
Log::warn('something');
Log::notice('something');
Log::debug('something');
Log::sql('something');</code></pre>
              </div>
            </div>

        </div>
      </div>

    </div>

<script src="http://cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="http://cdn.bootcss.com/holder/2.0/holder.min.js"></script>
<script src="http://cdn.bootcss.com/highlight.js/7.3/highlight.min.js"></script>
<script >hljs.initHighlightingOnLoad();</script>
<script src="http://v3.bootcss.com/assets/js/docs.min.js"></script>
  <script type="text/javascript">
      var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
      document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F87e90f311d6eafe1e1c02963e3aaeef2' type='text/javascript'%3E%3C/script%3E"));
  </script>
</body>
</html>
